#include "1wire.h"
#include <util/delay.h>
#include <avr/interrupt.h>
#include "crc8.h"

#define ilosc_powtorzen 3


uint8_t ucwire_ResetPulse (void)
{	uint8_t ucPresenceImpulse;
	OUT_1WIRE_LOW;				// ustaw port w stan niski
	DIR_1WIRE_OUT;				// kierunek pinu na wyjscie
	_delay_us(500);				// odczekanie 500us
	DIR_1WIRE_IN;				//kierunek pinu na wejscie
	_delay_us(70);				//oczekiwanie 45
	
	//if (bit_is_clear(PORT_1WIRE, PIN_1WIRE)) //spawdzamy poziom lini
	//	ucPresenceImpulse=1; 			//1 odebrano bit PRESENCE
	//else
		ucPresenceImpulse= PINA &0x0f;			//0stan aktywnow?ci zmienic na wiecen wejsc

	_delay_us(480);
	return ucPresenceImpulse;			//zwracamy wartosc do funkcji
}	

//wyslanie pojedynczego bitu


void v1Wire_SendBit(uint8_t cBit)
{
	DIR_1WIRE_OUT;
	_delay_us(5);
	
	if(cBit==1)
	DIR_1WIRE_IN;
	_delay_us(60);
	DIR_1WIRE_IN;
	_delay_us(1);
}



// Funkcja odbiera bit z magistrali

uint8_t uc1Wire_ReadBit(void)
{
//	uint8_t ucBit;
	//DIR_1WIRE_IN;
	//_delay_us(2);
	DIR_1WIRE_OUT;
	_delay_us(2);
	DIR_1WIRE_IN;
	_delay_us(12);
	//if (bit_is_set(PORT_1WIRE, PIN_1WIRE))
	//	ucBit=1;
	//else 
	//	ucBit=0;
	return (PINA & 0x0f);
}





// Funkcja wysyla bajt na magistrale

void v1Wire_SendByte (uint8_t ucByteValue)
{
	uint8_t ucCounter;
	uint8_t ucValueToSend;

	for (ucCounter=0; ucCounter<8; ucCounter++)
	{ ucValueToSend = ucByteValue >> ucCounter;
		ucValueToSend &= 0x01;
	v1Wire_SendBit (ucValueToSend);
	_delay_us(100);
	}
	//_delay_us(100);
}




// Funkcja odbiera bajt z magistrali

uint8_t uv1Wire_ReadByte(void)
{ 	
	uint8_t ucCounter;
	unsigned char ucReadByte=0;
	for (ucCounter=0; ucCounter<8; ucCounter++)
	{ if (uc1Wire_ReadBit())
		ucReadByte|=0x01<< ucCounter;
	_delay_us(50);
	}
	return (ucReadByte);
}

void oneWire_Read_pomiar(void)
{ 	
	uint8_t ucCounter;
	uint8_t tmp_1wire_pomiar[72];
	uint8_t tmp_1wire_pomiar_crc[9];
	//uint16_t tmp_onewire_wynik;
	static uint8_t counter_85_stopni[5]={0};
	

	for (ucCounter=0; ucCounter<72; ucCounter++)
	{ 
		tmp_1wire_pomiar[ucCounter]=uc1Wire_ReadBit();
		_delay_us(50);
	
	}
	if ((ucReset&0x01)==0)
	{	
//		onewire_wynik[0]=0;
// 		for (ucCounter=0; ucCounter<16; ucCounter++)
// 			{ 	if (tmp_1wire_pomiar[ucCounter]& 0x01)
// 				onewire_wynik[0]|= 1<< ucCounter;
// 			}
	wyluskaj_pomiar(tmp_1wire_pomiar,tmp_1wire_pomiar_crc,1<<0);

	if(!(crc8(tmp_1wire_pomiar_crc,9)))
	{
	kontrola_wyniku(&counter_85_stopni[0],&onewire_wynik[0],tmp_1wire_pomiar_crc);
	
	}	
	};

	if ((ucReset&0x02)==0)
 	{	
//	onewire_wynik[1]=0;
// 		for (ucCounter=0; ucCounter<16; ucCounter++)
// 			{ 	if (tmp_1wire_pomiar[ucCounter]& 0x02)
// 				onewire_wynik[1]|= 1<< ucCounter;
// 			}

	wyluskaj_pomiar(tmp_1wire_pomiar,tmp_1wire_pomiar_crc,1<<1);
	if(!(crc8(tmp_1wire_pomiar_crc,9)))
	{
		kontrola_wyniku(&counter_85_stopni[1],&onewire_wynik[1],tmp_1wire_pomiar_crc);
		
	}

	}

	if ((ucReset&0x04)==0)
	{	
//		onewire_wynik[2]=0;
// 		for (ucCounter=0; ucCounter<16; ucCounter++)
// 			{ 	if (tmp_1wire_pomiar[ucCounter]& 0x04)
// 				onewire_wynik[2]|= 1<< ucCounter;
// 			}
	wyluskaj_pomiar(tmp_1wire_pomiar,tmp_1wire_pomiar_crc,1<<2);
	if(!(crc8(tmp_1wire_pomiar_crc,9)))
	{
		kontrola_wyniku(&counter_85_stopni[2],&onewire_wynik[2],tmp_1wire_pomiar_crc);
		
	}

	}

	if ((ucReset&0x08)==0)
	{	
//		onewire_wynik[3]=0;
// 		for (ucCounter=0; ucCounter<16; ucCounter++)
// 			{ 	if (tmp_1wire_pomiar[ucCounter]& 0x08)
// 				onewire_wynik[3]|= 1<< ucCounter;
// 			}
	wyluskaj_pomiar(tmp_1wire_pomiar,tmp_1wire_pomiar_crc,1<<3);
	if(!(crc8(tmp_1wire_pomiar_crc,9)))
	{
		kontrola_wyniku(&counter_85_stopni[3],&onewire_wynik[3],tmp_1wire_pomiar_crc);
		
	}

	
	}
}



void pomiar_temp(void)
{	//	cli();
		ucReset= ucwire_ResetPulse();

		v1Wire_SendByte(0xCC);				//skip rom
		v1Wire_SendByte(0xBE);				//read scratchpad
		oneWire_Read_pomiar();
		
		ucReset=ucwire_ResetPulse();
	 	v1Wire_SendByte(0xCC);
		v1Wire_SendByte(0x44);				// rozkaz przetwarzania
		
	//	sei();
		
		
		
}


void kontrola_wyniku(uint8_t * counter , int16_t * wynik, uint8_t * data )
 {
		int16_t tmp_wynik;
		int8_t  tmp_wynik_8bit;
	tmp_wynik=( data[1]<<8 |data[0]);
	tmp_wynik_8bit= tmp_wynik>>4;
	
	if ((tmp_wynik_8bit)==85)
	{
		if((*counter)<ilosc_powtorzen)(*counter)++;
		
		else *wynik= tmp_wynik;
		
	}
	
	else
	{
		
	*wynik=tmp_wynik;
	*counter=0;
	
	}	
	
};

	void wyluskaj_pomiar (uint8_t * tablica_z_pomiarem,uint8_t* gotowy_wynik, uint8_t bit_odczytu)
{
	

	uint8_t licznik_bitow;
	uint8_t licznik;
	uint8_t licznik_bytow;
	for (licznik_bytow=0; licznik_bytow <9; licznik_bytow++)
	{
		for (licznik_bitow=(licznik_bytow*8),licznik=0; licznik<8; licznik_bitow++, licznik++)
		{ 	if (tablica_z_pomiarem[licznik_bitow]& bit_odczytu)
			gotowy_wynik[licznik_bytow]|= 1<< licznik;
			else gotowy_wynik[licznik_bytow]&= ~(1<< licznik);
		}
	}
}